package net.yla.smartbus.core.async;

import lombok.extern.slf4j.Slf4j;
import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;

/**
 * spring 原生线程池
 * 优点： 直接使用@Async注解即可，无需写成@Async("value")
 * @author ZengXiaoLiang
 * @date 2018/12/17 14:16
 */
@Slf4j
@Configuration
@EnableAsync
public class NativeAsyncTaskExecutePool implements AsyncConfigurer {

	@Value("${task.pool.corePoolSize}")
	private int corePoolSize;

	@Value("${task.pool.maxPoolSize}")
	private int maxPoolSize;

	@Value("${task.pool.keepAliveSeconds}")
	private int keepAliveSeconds;

	@Value("${task.pool.queueCapacity}")
	private int queueCapacity;

	@Override
	public Executor getAsyncExecutor() {
		ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
		//核心线程池大小
		executor.setCorePoolSize(corePoolSize);
		//最大线程数
		executor.setMaxPoolSize(maxPoolSize);
		//队列容量
		executor.setQueueCapacity(queueCapacity);
		//活跃时间
		executor.setKeepAliveSeconds(keepAliveSeconds);
		//线程名字前缀
		executor.setThreadNamePrefix("NewSaleExecutor-");

		// setRejectedExecutionHandler：当pool已经达到max size的时候，如何处理新任务
		// CallerRunsPolicy：不在新线程中执行任务，而是由调用者所在的线程来执行
		executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
		executor.initialize();
		return executor;
	}

	@Override
	public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
		return null;
	}
}
